package com.javaweb.secondhand_trading.common;

import lombok.Data;
import java.io.Serializable;

/**
 * 统一API响应格式封装
 * @param <T> 数据类型泛型
 */
@Data
public class BaseResponse<T> implements Serializable {
    private static final long serialVersionUID = 1L;

    // 核心字段
    private boolean success;    // 请求是否成功
    private int code;           // 状态码（200=成功，其他=错误码）
    private String message;     // 对用户友好的提示消息
    private T data;            // 返回的业务数据
    private long timestamp;    // 响应时间戳（毫秒）

    // 扩展字段（可选）
    private String requestId;  // 请求追踪ID（可用于日志追踪）
    private String path;      // 请求路径

    /**
     * 全参数构造器（私有化，强制使用静态工厂方法）
     */
    private BaseResponse(boolean success, int code, String message, T data) {
        this.success = success;
        this.code = code;
        this.message = message;
        this.data = data;
        this.timestamp = System.currentTimeMillis();
    }

    // ========== 成功响应 ========== //

    /**
     * 通用成功响应（默认200状态码）
     */
    public static <T> BaseResponse<T> success(T data) {
        return new BaseResponse<>(true, 200, "操作成功", data);
    }

    /**
     * 带自定义消息的成功响应
     */
    public static <T> BaseResponse<T> success(String message, T data) {
        return new BaseResponse<>(true, 200, message, data);
    }

    /**
     * 成功无数据返回（用于无需返回数据的操作）
     */
    public static <T> BaseResponse<T> success() {
        return success(null);
    }

    // ========== 失败响应 ========== //

    /**
     * 通用错误响应（需指定错误码和消息）
     */
    public static <T> BaseResponse<T> error(int code, String message) {
        return new BaseResponse<>(false, code, message, null);
    }

    /**
     * 参数验证失败响应（400状态码）
     */
    public static <T> BaseResponse<T> validateFailed(String message) {
        return error(400, message);
    }

    /**
     * 未授权响应（401状态码）
     */
    public static <T> BaseResponse<T> unauthorized(String message) {
        return error(401, message);
    }

    /**
     * 禁止访问响应（403状态码）
     */
    public static <T> BaseResponse<T> forbidden(String message) {
        return error(403, message);
    }

    // ========== 链式调用增强 ========== //

    /**
     * 设置请求路径（链式调用）
     */
    public BaseResponse<T> path(String path) {
        this.path = path;
        return this;
    }

    /**
     * 设置请求ID（链式调用）
     */
    public BaseResponse<T> requestId(String requestId) {
        this.requestId = requestId;
        return this;
    }
}